<?php
namespace app\middleware;

use think\facade\Cache;
use think\Response;

class AuthMiddleware
{
    // Redis用户信息前缀
    private $redisPrefix = 'token:';

    /**
     * 白名单路由 - 不需要登录验证的页面
     */
    protected $whitelist = [
        'user/checklogin', //验证登录页面
        'user/login',      // 登录页面
        'user/register',   // 注册页面
        'index',
    ];

    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        $path = strtolower($request->pathinfo());

        // 检查是否在白名单
        if (in_array($path, $this->whitelist)) {
            return $next($request);
        }

        $controller = strtolower($request->controller());
        $action = strtolower($request->action());
        $route = "{$controller}/{$action}";

        if (in_array($route, $this->whitelist)) {
            return $next($request);
        }

        //         // 从请求头中获取 Authorization
        // $authHeader = $request->header('Authorization');
        // if ($authHeader || stripos($authHeader, 'Bearer ') === 0) {
        //     $token = substr($authHeader, 7); // 去掉 Bearer 
        // }
        // $userData = Cache::store('redis')->get($this->redisPrefix . $token);

        // 检查是否登录
        if (!$this->checkToken($request)) {
            return json([
                'code' => 401,
                'msg' => '请先登录',
                // 'token' => $userData
            ], 401);
        }

        return $next($request);
    }

    /**
     * 使用Redis检查token是否合法
     *
     * @param \think\Request $request
     * @return bool
     */
    protected function checkToken($request)
    {
        // 从请求头中获取 Authorization
        $authHeader = $request->header('Authorization');
        if ($authHeader && stripos($authHeader, 'Bearer ') === 0) {
            $token = substr($authHeader, 7); // 去掉 Bearer 
        }


        if (!empty($token)) {
            // 通过 Redis 检查 token 是否存在
            $userData = Cache::store('redis')->get($this->redisPrefix . $token);
        }

        if (!empty($userData)) {
            return true;
        }

        // // 可以把用户ID存到 request 里，方便控制器使用
        // $request->user_id = $userId;

        return false;
    }
}
